package com.thesis.manage.common.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author php
 * @date 2017/11/30
 */
public interface RedisDao {

    /**
     * 集合右插入
     *
     * @param key
     * @param value
     */
    void rpush(String key, String... value);

    /**
     * 集合左插入
     *
     * @param key
     * @param value
     */
    void lpush(String key, String... value);

    /**
     * 获取指定键集合的长度
     * if no exist return 0
     *
     * @param key
     * @return
     */
    Long llen(String key);

    /**
     * 获取指定键集合
     *
     * @param key
     * @param start 0代表第一位
     * @param end   -1代表最后一位
     * @return
     */
    List lrange(String key, int start, int end);

    /**
     * 在列表中index的位置设置value值
     *
     * @param key
     * @param index
     * @param value
     */
    void lset(String key, int index, String value);

    /**
     * 弹出最左边的元素，弹出之后该值在列表中将不复存在
     *
     * @param key
     */
    String lpop(String key);

    /**
     * 弹出最右边的元素，弹出之后该值在列表中将不复存在
     *
     * @param key
     * @return
     */
    String rpop(String key);

    /**
     * 判断键是否存在
     *
     * @param key
     * @return
     */
    boolean exists(String key);

    void del(String key);

    void set(String key, String value);

    String get(String key);

    /**
     * 批量获取
     *
     * @param keys
     * @return
     */
    List multiGet(List<String> keys);


    /**
     * 设置键的字符串值并返回其旧值
     *
     * @param key
     * @param value
     * @return
     */
    String getAndSet(String key, String value);

    /**
     * 从存储在键中的列表中删除等于值的元素的第一个计数事件。
     * 计数参数以下列方式影响操作：
     * count> 0：删除等于从头到尾移动的值的元素。
     * count <0：删除等于从尾到头移动的值的元素。
     * count = 0：删除等于value的所有元素。
     *
     * @param key
     * @param count
     * @param value
     */
    void lrem(String key, Integer count, String value);

    /**
     * 无序集合中添加元素
     *
     * @param key
     * @param value
     */
    void sadd(String key, String value);

    /**
     * 移除并返回集合中的一个随机元素
     *
     * @param key
     * @return
     */
    String spop(String key);

    /**
     * 返回set集合中的所有成员
     *
     * @param key
     * @return
     */
    Set<String> smembers(String key);

    /**
     * 返回set集合的元素个数
     *
     * @param key
     * @return
     */
    Long scard(String key);

    void expire(String key, int value);

    /**
     * 给键设置值和过期时间
     *
     * @param key
     * @param expireTime
     * @param value
     */
    void setex(String key, int expireTime, String value);

    void srem(String key, String value);

    /**
     * 判断 member 元素是否是集合 key 的成员
     *
     * @param key
     * @param value
     * @return
     */
    boolean sismember(String key, String value);

    /**
     * 让键的整数部分自动+1
     *
     * @param key
     * @return
     */
    Long incr(String key);

    Long hdelete(String key, String hashKey);

    boolean hasKey(String key, String hashKey);

    Object hget(String key, String hashKey);

    List<Object> hMulityGet(String key, List<Object> hashKeys);

    Set<Object> hkeys(String key);

    Long hsize(String key);

    void hput(String key, String hashKey, Object value);

    void hputAll(String key, Map<? extends String, ? extends Object> keyAndValue);

    Map<Object, Object> hEntries(String key);
}
